package mwt.xml.xdbforms.dblayer.query.impl;

import java.sql.Connection;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import mwt.xml.xdbforms.dblayer.query.QueryParameterBuilder;

/**
 * Crea una classe per costruire in sequenza
 * le varie parti di un PreparatedStatement usando
 * un query builder
 * @author Gianfranco Murador
 */
public class QueryParameterBuilderDirector {

    /**
     * Istanza privata del builder
     */
    private QueryParameterBuilder builder;

    /**
     * Costruttore
     * @param builder Oggetto che implementa l'interfaccia del query builder
     */
    public QueryParameterBuilderDirector(QueryParameterBuilder builder) {
        this.builder = builder;
    }

    public PreparedStatement createInsertStatement(Connection c) {

        builder.setCurrentConnection(c);
        builder.initializeStatement();
        buildStatement();
        return builder.getResult();
    }

    public PreparedStatement createUpdateStatement(Connection c) {

        builder.setCurrentConnection(c);
        builder.initializeStatement();
        buildStatement();
        return builder.getResult();
    }

    public PreparedStatement createSelectStatement(Connection c) {

        builder.setCurrentConnection(c);
        builder.initializeStatement();
        buildStatement();
        return builder.getResult();

    }

    /**
     * Questo metodo richiama il builder per creare un preparedStatment
     * NOTA: costruisce il PreparatedStatement tenendo conto
     * della compatibiltà dei tipi usando i meta dati dei parametri.
     * Usa la reflection per capire se i due tipi sono compatibili
     * di uno statement.
     */
    private void buildStatement() {

        int count = 0;
        // int type = 0;
        String classParamName = null;
        String classValueName = null;
        ParameterMetaData parameterMetaData =
                builder.getParameterMetaData();
        Object[] values = builder.getOperation().getValues();

        System.out.println("PARAMETERMETADATA: " + parameterMetaData);

        //List<SQLParameter> parameters = builder.getOperation().getParameters();

        try {


            count = parameterMetaData.getParameterCount();

            System.out.println("NUMERO DI PARAMETRI: " + count);

            for (int i = 1; i <= count; i++) {

                System.out.println("INDICE DEL PARAMETRO " + i);

                Object val = values[i - 1];
                System.out.println("VALORE : "+val.toString());

                /*

                classParamName = parameterMetaData.getParameterClassName(i);

                Class c = val.getClass();
                classValueName = c.getCanonicalName();

                if (!classValueName.equals(classParamName)) {

                    // I valori inseriti sono di tipo non valido per il campo
                    String message = "Invalid values type, provided " + classValueName + "\n";
                    message += "required " + classParamName;
                    throw new RuntimeException(message);
                }*/

                builder.addParameterValue(i, val);

            }

        } catch (SQLException ex) {
            Logger.getLogger(QueryParameterBuilderDirector.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
}

